{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from __future__ import print_function\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib\n",
    "matplotlib.use('Agg')\n",
    "import matplotlib.pyplot as plt\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense, Dropout\n",
    "from keras_contrib.layers import SReLU\n",
    "from keras.callbacks import BaseLogger, EarlyStopping, ReduceLROnPlateau, TensorBoard\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.utils import compute_class_weight\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.metrics import classification_report, roc_curve, auc, precision_recall_curve\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from keras.utils import np_utils\n",
    "from scipy import stats\n",
    "import os\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = 1\n",
    "data = pd.read_csv('creditcard.csv')\n",
    "data.iloc[:, 1:29] = StandardScaler().fit_transform(data.iloc[:, 1:29])\n",
    "data_matrix = data.as_matrix()\n",
    "X = data_matrix[:, 1:29]\n",
    "Y = data_matrix[:, 30]\n",
    "class_weights = dict(zip([0, 1], compute_class_weight('balanced', [0, 1], Y)))\n",
    "kfold = StratifiedKFold(n_splits = 5, shuffle = True, random_state = seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# encode class values as integers\n",
    "encoder = LabelEncoder()\n",
    "encoded_Y = encoder.fit_transform(Y)\n",
    "# convert integers to dummy variables (one hot encoding)\n",
    "dummy_y = np_utils.to_categorical(encoded_Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define a model generator\n",
    "def generate_model():\n",
    "    _model = Sequential()\n",
    "    _model.add(Dense(15, input_dim=28))\n",
    "    _model.add(SReLU())\n",
    "    _model.add(Dropout(0.2))\n",
    "    _model.add(Dense(2, activation='sigmoid'))\n",
    "    _model.compile(loss='binary_crossentropy', optimizer='adam')\n",
    "    return _model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = np.empty([len(Y), kfold.n_splits])\n",
    "\n",
    "k = 0 \n",
    "for train, test in kfold.split(X, np.zeros(shape=(X.shape[0], 1))):\n",
    "    X_train, X_test = X[train], X[test]\n",
    "    y_train, y_test = dummy_y[train], dummy_y[test]\n",
    "    # Define model\n",
    "    model = generate_model()\n",
    "    # Fit the model\n",
    "    history = model.fit(X_train, y_train,\n",
    "                        batch_size=1200,\n",
    "                        epochs=100,\n",
    "                        verbose=0,\n",
    "                        shuffle=True,\n",
    "                        validation_data=(X_test, y_test),\n",
    "                        class_weight=class_weights)\n",
    "    # Store the predicted probabilities and iterate k\n",
    "    pred = model.predict_classes(X_test)\n",
    "    predictions[test, k] = pred\n",
    "    k += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "        0.0       1.00      0.99      0.99    284315\n",
      "        1.0       0.12      0.89      0.22       492\n",
      "\n",
      "avg / total       1.00      0.99      0.99    284807\n",
      "\n",
      "Predictions       0     1\n",
      "Truth                    \n",
      "0.0          281195  3120\n",
      "1.0              56   436\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f26666d2b10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# yhat = np.nanmean(predictions, axis=1).round().astype(int)\n",
    "# yhat = stats.mode(predictions.T).mode.T[:,0]\n",
    "yhat = np.max(predictions, axis=1).round().astype(int)\n",
    "\n",
    "# Performance\n",
    "print(classification_report(Y, yhat))\n",
    "print(pd.crosstab(Y, yhat.flatten(), rownames=['Truth'], colnames=['Predictions']))\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(Y, yhat)\n",
    "roc_auc = auc(fpr, tpr)\n",
    "\n",
    "plt.title('Receiver Operating Characteristic')\n",
    "plt.plot(fpr, tpr, 'b', label='AUC = %0.2f'% roc_auc)\n",
    "plt.legend(loc='lower right')\n",
    "plt.plot([0,1],[0,1],'r--')\n",
    "plt.xlim([0.,1.])\n",
    "plt.ylim([0.,1.])\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEWCAYAAAB42tAoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XecXGXZxvHflUYLECDhBROKQigp0pbQlF4CaBCIkCBCIBAbIi0IolKVEhABUQhIrwEEQxMR6TUbEwJJRAJSArwSFCkSqff7x3Pm3clmszu72dkz5fp+PvPJlDMz95zdzL3nnOd6jiICMzOzRemWdwFmZlbZ3CjMzKxVbhRmZtYqNwozM2uVG4WZmbXKjcLMzFrlRmFVRdJMSdu2sczqkt6X1L2LyiorSWMkPVJ0OyStnWdNVl/cKKxTSHpJ0vzsC/ofki6X1Luz3yciBkfEA20s80pE9I6ITzv7/bMv6f9kn/M1Sb+otIYkaRdJD0l6T9I8SQ9KGpF3XVa93CisM301InoDGwObAj9uvoCSav+92yD7nNsA+wIH51zP/5M0ErgJuAoYAPwP8FPgqx14rVr4WVkn8C+BdbqIeA24GxgCIOkBST+T9CjwAfAFSctL+q2kN7K/zE8r/stc0qGSZmd/Fc+StHF2/0uSdsyuD5PUKOndbCvmF9n9a2Z/+ffIbn9O0mRJ/5I0R9KhRe9zkqRJkq7K3mumpIYSP+cc4FFgw6LX6+jnOk7SC0X379ne9S5JwC+AUyPi0oh4JyI+i4gHI+LQos97TdFzmq+r5j+rH0lqbPY+R0qanF1fQtLZkl7JfgYXSVqqvbVbZXOjsE4naTVgN2Ba0d3fBMYBywIvA1cCnwBrAxsBOwOHZM//OnAScACwHDAC+GcLb3UecF5ELAesBUxaREnXA3OBzwEjgZ9L2qHo8RHADUAfYDLwqxI/53rAl4E5RXd39HO9kL3W8sDJwDWSVi2ljiLrAqsBN7fzec0V/6wuANaVNLDo8f2A67LrZwLrkJrl2kB/0haM1ZKI8MWXxb4ALwHvA/8mNYJfA0tljz0AnFK07P8AHxYez+4bDdyfXb8H+EEr77Njdv0h0pdq32bLrAkE0IP0xfkpsGzR46cDV2TXTwL+VPTYIGB+K58zgHeB/2TXrweWWNzP1cL7TAf2yK6PAR5pVsPaLTxnq+yxJVt53ZOAa1paVy39rLL7rgF+ml0fCLwHLA0oWw9rFS27BfD3vH8ffenci7corDN9LSL6RMQaEfHdiJhf9NirRdfXAHoCb0j6t6R/AxcDK2ePr0b6C7stY0l/zf5V0hRJX2lhmc8B/4qI94rue5n0l2/B/xZd/wBYsrArZhE2BnqTjk9sBiyzuJ9L0gGSphc9bwjQt5UaWlLYOmnvlkhzrza7fR2p4UHamrgtIj4A+pEaxtSiuv+Q3W81xI3CukrxNMWvkv7y7ps1lj4RsVxEDC56fK02XzDi+YgYTfoiPhO4WdIyzRZ7HVhR0rJF960OvNbRD5K9d0TEJOBxmna1dOhzSVoDuAQ4DFgpIvoAz5L+Ym+P57L32LuVZf5D+nIvWKWFZZpPKf1HoK+kDUkNo7Db6S1gPjC46PMuH+lAv9UQNwrrchHxBunL5xxJy0nqJmktSdtki1wKHCNpk2zkzdrZl+kCJO0vqV9EfEba5QVpN1Pxe70KPAacLmlJSV8kbYlc20kf5wxgnKRVFuNzLUP6cp6Xfa6DyAYCtEdEBHAU8BNJBxXV8CVJE7PFpgNbK2VNlgeOL+F1PyEd95gArAjcm93/GanBnStp5az2/pJ2aW/tVtncKCwvBwC9gFnA26QvolUBIuIm4Gekv1zfA24jfUE1NxyYKel90oHtURHx3xaWG03aF/86cCtwYkTc2xkfIiKeAR4Exnf0c0XELOAc0tbJP4ChpNFUHannZpqG7L6evd5pwO+zx+8FbgRmAFOBO0p86euAHYGbssZR8EPSwfwnJL0L/Il0UN1qiNIfIWZmZi3zFoWZmbWqbI1C0mWS3pT07CIel6TzswDUjELwyMzMKks5tyiuIO1DXpRdSWOyB5LCPb8pYy1mZtZBZWsUEfEQ8K9WFtkDuCobZvgE0KcDSVQzMyuz1kJF5dafBYM9c7P73mi+oKRxpK0OYKVNVlppTQYMgB55Vm9mVkWmTp36VkR0KAyZ51dtS2GiFodgRcREYCLAqqs2xLx5jfToARdcACNHgtobSzIzqzOSXu7oc/Mc9TSXNKVBwQDSuO9W9e8PjY3p3332gT33hNcWK2NrZmatybNRTAYOyEY/bQ68kyVb27ThhvDkkzBhAvzxjzBoEFx8MXz2WXkLNjOrR+UcHns9KWm6rqS5ksZK+rakb2eL3AW8SEp1XgJ8tz2v36MHHHMMPPMMNDTAt78N220Hf/tbp34MM7O6V3XJ7IaGhmhsXOA8KkTA5ZfD0UfD/Plw4ompifTsmVORZmYVRtLUiCjppFzN1UQyW4KDD4ZZs+ArX4Ef/Qg23TQdyzAzs8VTE42iYNVV4eab4Xe/gzffhM02g/Hj4YMP8q7MzKx61VSjKNhzz7R1ccghcPbZMHQo3Hdf3lWZmVWnmmwUAH36pJFQDzwA3bvDjjum3VNvv513ZWZm1aVmG0XBNtvA00/DccfBVVfB+uun3VNVdgzfzCw3Nd8oAJZaCk4/HaZMSUG9r3/dQT0zs1LVRaMo2GijFNQ76yy4554U1Js40UE9M7PW1FWjgBTUGz8+BfU22QS+9S3YfnsH9czMFqXuGkXB2munkVCXXgrTp8MXvwhnnAEff5x3ZWZmlaVuGwWkoN7YsTB7dgrqHX88DBsGU6fmXZmZWeWo60ZRUBzU+8c/UrNwUM/MLHGjKFII6o0d66CemVmBG0UzffqkkVD33w/duqWg3tixDuqZWf1yo1iEbbeFGTPghz+EK690UM/M6pcbRSuWWiqNhCoO6u21F7ze5nn4zMxqhxtFCQpBvTPPhD/8IW1dOKhnZvXCjaJEPXrAsccuHNR7/vm8KzMzKy83inYqBPUuuSQF9YYOdVDPzGqbG0UHSOlcF7Nnw+67NwX1/vKXvCszM+t8bhSLYdVV4ZZb0qUQ1Dv2WAf1zKy2uFF0gr32SkG9gw+GCRPSvFF//nPeVZmZdQ43ik5SCOr9+c9p19QOO6TdUw7qmVm1c6PoZNtt1xTUu+KKdM6LW27Juyozs45zoyiDQlDvqafScYyRIx3UM7Pq5UZRRhtvnJrFmWfC3XenrYtLLnFQz8yqixtFmRWCejNmpIT3uHHp+IWDemZWLdwousjAgelA9yWXwLRpaWTUmWc6qGdmlc+NogsVgnqzZsGuu8Jxx8FmmzmoZ2aVzY0iB5/7XDqb3i23wBtvOKhnZpXNjSJHe+2VpgE56CAH9cyscrlR5KxPn3TcotAgHNQzs0rjRlEhttsuTWF+7LEO6plZZXGjqCBLLZVGQj31FKyyioN6ZlYZ3CgqUCGod8YZCwb1fL5uM8uDG0WF6tkzzRdVHNTbfnuYMyfvysys3pS1UUgaLuk5SXMkHdfC46tLul/SNEkzJO1Wznqq0cCB6Yx6EyemoN7QoWn31Cef5F2ZmdWLsjUKSd2BC4FdgUHAaEmDmi32Y2BSRGwEjAJ+Xa56qlm3bnDooQsG9XxGPTPrKuXcohgGzImIFyPiI+AGYI9mywSwXHZ9ecCHbVvRUlDvhz90UM/MyqucjaI/8GrR7bnZfcVOAvaXNBe4C/h+Sy8kaZykRkmN8+bNK0etVaVwRr2DDoKzzkpBvfvvz7sqM6tV5WwUauG+5uN2RgNXRMQAYDfgakkL1RQREyOiISIa+vXrV4ZSq88KK6SRUPfdl25vv33aPfXvf+dbl5nVnnI2irnAakW3B7DwrqWxwCSAiHgcWBLoW8aaas7226eRUcceC5dfDuuvn3ZPmZl1lnI2iinAQEmfl9SLdLB6crNlXgF2AJC0PqlReN9SOy299IJBvb33Tpc33si7MjOrBWVrFBHxCXAYcA8wmzS6aaakUySNyBY7GjhU0tPA9cCYCMfKOqo4qHfXXWnr4tJLHdQzs8WjavtebmhoiMbGxrzLqHjPP5+OWTz4YJpHauJEWHvtvKsys7xImhoRDR15rpPZNapwRr2JE2Hq1BTUO+ssB/XMrP3cKGpYIag3ezYMH54yF8OGpYS3mVmp3CjqwOc+B7feCjffnA5wb7ppahrz5+ddmZlVAzeKOrL33imoN2ZMU1DvgQfyrsrMKp0bRZ1ZYYU0Euq+++Czz9KBbgf1zKw1bhR1avvt0xn1xo+Hyy5L57y49da8qzKzSuRGUceWXjrtgnrqKVh55TSHlIN6ZtacG4WxySYwZQqcfjrceWfauvjtbx3UM7PEjcKAdEa9445L80Z98YtwyCGwww4+o56ZuVFYM+usk6Ysv/hiB/XMLHGjsIV065bO0T1rFuyyi4N6ZvXOjcIWqX//pqDe66+noN5xxzmoZ1Zv3CisVVIaCTV7Nhx4YJrO3EE9s/riRmElWWGFNBLqT39qCuqNG+egnlk9cKOwdtlhhxTUO+aY1Dgc1DOrfW4U1m5LLw0TJiwY1Bs5Ev73f/OuzMzKwY3COqwQ1Pv5z+GOO9IZ9RzUM6s9bhS2WHr2hOOPd1DPrJa5UVinaCmoN2GCg3pmtcCNwjpN86DescfCZpvB9Ol5V2Zmi8ONwjpdIah3003w2mvQ0JB2TzmoZ1ad3CisLKQ0EmrWrBTUO+MM2GADePDBvCszs/Zyo7CyWnHFpqDep5/CttvCt77loJ5ZNXGjsC5RHNS79NIU1LvttryrMrNSuFFYlykE9Z58Evr1gz33hK9/3UE9s0rnRmFdrqEBGhtTUO/221NQ77LLHNQzq1RuFJaLQlDv6adT5mLsWNhxR3jhhbwrM7Pm3CgsV+uum6Ysv+iitJXhoJ5Z5XGjsNx165ZGQs2aBTvvnIJ6m2/uoJ5ZpXCjsIpRCOpNmgSvvuqgnlmlcKOwiiKlkVCzZ8MBBzioZ1YJ3CisIq24YhoJde+96XhFIaj3zjt5V2ZWf9worKLtuGMK6h19dFNQ7/e/z7sqs/riRmEVb5ll4Oyz4YknoG9f+NrXHNQz60plbRSShkt6TtIcScctYpl9JM2SNFPSdeWsx6rbppumIbQ/+5mDemZdqWyNQlJ34EJgV2AQMFrSoGbLDASOB7aKiMHAEeWqx2pDz57wox85qGfWlcq5RTEMmBMRL0bER8ANwB7NljkUuDAi3gaIiDfLWI/VkJaCemef7aCeWTmUs1H0B14tuj03u6/YOsA6kh6V9ISk4S29kKRxkholNc6bN69M5Vq1KQ7q7bQTjB/voJ5ZOZSzUaiF+5rvTe4BDAS2BUYDl0rqs9CTIiZGRENENPTr16/TC7Xq1r9/mrK8OKj3ox/Bf/+bd2VmtaHkRiGpv6QtJW1duLTxlLnAakW3BwCvt7DM7yPi44j4O/AcqXGYtUtxUO+b34TTT09BvYceyrsys+pXUqOQdCbwKPBjYHx2OaaNp00BBkr6vKRewChgcrNlbgO2y96jL2lX1IslV2/WzIorwuWXp6Dexx/DNtvAt7/toJ7Z4ih1i+JrwLoRsVtEfDW7jGjtCRHxCXAYcA8wG5gUETMlnSKp8Nx7gH9KmgXcD4yPiH927KOYNSkE9Y46Ci65xEE9s8WhKGEQuqS7ga9HxPvlL6l1DQ0N0djYmHcZVkWmTIFDDoEZM2DkSLjgAlhllbyrMutakqZGRENHnlvqFsUHwHRJF0s6v3DpyBuadbVCUO+002Dy5LR1cfnlDuqZlarURjEZOBV4DJhadDGrCj17wgknpKDekCFw8MFpSO2LPiJm1qaSGkVEXAlcT1ODuC67z6yqrLdeCur95jfw1FOpaZxzjoN6Zq0pddTTtsDzpCk5fg38rYThsWYVqVu3NBJq1qx00PuYY2CLLdLWhpktrNRdT+cAO0fENhGxNbALcG75yjIrvwED0kioG2+EV15JQb0TTnBQz6y5UhtFz4h4rnAjIv4G9CxPSWZdR4J99klbF/vvDz//uYN6Zs2V2igaJf1W0rbZ5RJ8MNtqyEorpZFQf/wjfPRRCup95zsO6plB6Y3iO8BM4HDgB8As4NvlKsosLzvtBM8+m4J6EyfC4MFpSK1ZPSt11NOHEfGLiNgrIvaMiHMj4sNyF2eWh2WWSSOhHn88TQmyxx5p99Q//pF3ZWb5aLVRSJqU/fuMpBnNL11Tolk+hg1rCur9/vfpjHoO6lk9anUKD0mrRsQbktZo6fGIeLlslS2Cp/CwPPz1r3DoofDII2lI7cUXwxe+kHdVZqUr2xQeEfFGdvUt4NWsMSwBbMDCU4ab1az11oMHH4Rf/xqefNJBPasvpR7MfghYUlJ/4D7gIOCKchVlVom6dUsjoZoH9WZ4J6zVuFIbhSLiA2Av4IKI2BMYVL6yzCpXIah3ww3w8suwySYO6lltK7lRSNoC+AZwZ3Zfj/KUZFb5JNh333RGvW98IwX1NtwQHn4478rMOl+pjeII4Hjg1uzkQ18gnWjIrK6ttBJccQXccw98+CFsvbWDelZ7Ss1RPBgRIyLizOz2ixFxeHlLM6seO++cgnpHHumgntWetnIUv8z+vV3S5OaXrinRrDosswz84hcpqLfCCimot+++DupZ9WvrOMPV2b9nl7sQs1oxbBhMnQoTJsApp8C996YGcuCB6diGWbVpK0dRmPivEXg42wX1IPAIMKXcxZlVq169ms6oN3gwHHRQ2j3lM+pZNSr1YPZ9wNJFt5cC/tT55ZjVluZBvaFD09bFp5/mXZlZ6UptFEtGxPuFG9n1pVtZ3swyhaDezJmw/fZw9NEO6ll1KbVR/EfSxoUbkjYB5penJLPatNpqaSTUDTfASy+loN6Pf+ygnlW+9uQobpL0sKSHgRuBw8pXllltKg7q7bcf/OxnDupZ5Ss1RzEFWI90AqPvAusXHeg2s3ZaaSW48soFg3rf/S68+27elZktrKRGIWlp4IfADyLiGWBNSV8pa2VmdWDnneGZZ+CII+Cii2DQILj99ryrMltQqbueLgc+ArbIbs8FTitLRWZ1pndvOPfcpqDeiBEO6lllKbVRrBURZwEfA0TEfMDRIbNOtNlmKah36qlw223pjHpXXukz6ln+Sm0UH0laCggASWsBPme2WSfr1SuNhJo+Pe2GGjMGdtkF/v73vCuzelZqozgR+AOwmqRrSQG8Y8tWlVmdW399eOghuPDCtEtqyJC0e8pBPctDm41CkoC/kk5aNAa4HmiIiAfKWplZnevWLY2EmjULttsOjjrKQT3LR5uNIiICuC0i/hkRd0bEHRHxVhfUZmakoN7tt8P11zcF9X7yEwf1rOuUuuvpCUmblrUSM1skCUaNagrqnXYabLQRPPJI3pVZPSi1UWxHahYvSJoh6RlJ3gA262KFoN4f/gDz58OXv+ygnpVfqee93rWsVZhZu+yySzqj3k9+Auedl+aQ+s1v4Ktfzbsyq0VtneFuSUlHAOOB4cBrEfFy4dLWi0saLuk5SXMkHdfKciMlhaSGdn8CszrVUlBv1Ch48828K7Na09aupyuBBuAZ0lbFOaW+sKTuwIXZ8wYBoyUNamG5ZYHDgSdLfW0za1II6p1yCtx6q4N61vnaahSDImL/iLgYGAl8uR2vPQyYExEvRsRHwA3AHi0sdypwFuAxHGYd1KtX2g01fXpqFGPGwPDhDupZ52irUXxcuBIRn7TztfsDrxbdnpvd9/8kbQSsFhF3tPZCksZJapTUOG/evHaWYVY/CkG9X/0KHnvMQT3rHG01ig0kvZtd3gO+WLguqa1xFi3NBfX/G8OSugHnAke3VWRETIyIhoho6NevX1uLm9W1bt3ge99bMKi35ZZpllqzjmi1UURE94hYLrssGxE9iq4v18ZrzwVWK7o9AHi96PaywBDgAUkvAZsDk31A26xzFIJ6110HL74IG2/soJ51TKk5io6YAgyU9HlJvYBRwOTCgxHxTkT0jYg1I2JN4AlgREQ0lrEms7oiwejRKag3erSDetYxZWsU2TGNw4B7gNnApIiYKekUSSPK9b5mtrC+feGqq+Duu5uCet/7noN6VhpFlY2ha2hoiMZGb3SYddT776epzM8/H/r3T0G9r/h8lTVP0tSI6NCu/XLuejKzCtS7N/zylymo16dPSnOPHu2gni2aG4VZnSoO6v3ud2lo7VVXOahnC3OjMKtjhaDetGmw3npw4IEpqPfSS3lXZpXEjcLMGDQIHn64Kag3eHDaPeWgnoEbhZllCkG9mTNh223hyCMd1LPEjcLMFrD66nDHHQsG9X76U/jww7wrs7y4UZjZQoqDeqNGwamnwoYbwqOP5l2Z5cGNwswWqW9fuPrqFNT74AP40pcc1KtHbhRm1qbhw9Oxi8MPTwG9wYPhzjvzrsq6ihuFmZWkd+902tXHHoPll09pbgf16oMbhZm1y+abw1/+AiefDLfckoJ6V1/toF4tc6Mws3br1SuNhJo+HdZdFw44AHbd1UG9WuVGYWYdNmhQmrL8ggvSiKghQ9LuKQf1aosbhZktlm7d4LDD0sHurbeGI46ArbaCZ5/NuzLrLG4UZtYpVl89jYS69lp44YV0giQH9WqDG4WZdRoJ9tvPQb1a40ZhZp2uENS7664U1Pvyl9Puqffey7sy6wg3CjMrm113Tccuvv99+PWv08FvB/WqjxuFmZVVS0G9/faDefPyrsxK5UZhZl2iENQ76SS4+WYH9aqJG4WZdZleveDEE1NQb511moJ6L7+cd2XWGjcKM+tyhTPqnX9+CuwNHuygXiVzozCzXHTvng5yz5rloF6lc6Mws1wVgnrXXANz5qQz6p14ooN6lcSNwsxyJ8E3vpGCevvsA6eckpLdjz2Wd2UGbhRmVkH69UtbFnfdBe+/n86o9/3vO6iXNzcKM6s4xUG9Cy9MB7vvuivvquqXG4WZVaRll00joR59NF3fffe0e8pBva7nRmFmFW2LLZqCejfdlIJ611zjoF5XcqMws4q3xBJpJNS0aTBwIHzzm7Dbbg7qdRU3CjOrGoMHp4De+eenwN7gwem6g3rl5UZhZlWlENSbOTNNX/6DH6Sg3syZeVdWu9wozKwqrbFGGglVCOpttJGDeuXiRmFmVctBva5R1kYhabik5yTNkXRcC48fJWmWpBmS7pO0RjnrMbPaVAjq3Xmng3rlULZGIak7cCGwKzAIGC1pULPFpgENEfFF4GbgrHLVY2a1b7fd0rGKww5zUK8zlXOLYhgwJyJejIiPgBuAPYoXiIj7I+KD7OYTwIAy1mNmdWDZZdNIqEcfTWfXc1Bv8ZWzUfQHXi26PTe7b1HGAne39ICkcZIaJTXO80/bzEqwxRYpd3HiiQ7qLa5yNgq1cF+LPyJJ+wMNwISWHo+IiRHREBEN/fr168QSzayWLbFESnQ7qLd4ytko5gKrFd0eALzefCFJOwInACMiwgPbzKzTFYJ6553noF5HlLNRTAEGSvq8pF7AKGBy8QKSNgIuJjWJN8tYi5nVue7d4fDDFwzqfelLDuqVomyNIiI+AQ4D7gFmA5MiYqakUySNyBabAPQGbpI0XdLkRbycmVmnKAT1rr4ann8+5S5OOslBvdYoquzITkNDQzQ2NuZdhpnVgHnz0rm6r7sOBg2CSy9NB8FrkaSpEdHQkec6mW1mdatfP7j22hTUe++9NGfU4Yc7qNecG4WZ1b3ioN6vfgVDhsDdLQ7Wr09uFGZmNAX1HnkEllkmNY/993dQD9wozMwWsOWWTUG9SZPSsYtrr63voJ4bhZlZM4Wg3l/+AmutlbYsdt+9foN6bhRmZoswZEiaM+q88+Chh+o3qOdGYWbWikJQ79lnU0CvHoN6bhRmZiVYc800Eqoeg3puFGZmJZLS8YpZs2DkSDj5ZNh4Y3j88bwrKy83CjOzdlp55ZTmvuOOBYN677+fd2Xl4UZhZtZBu++ejlV873spqDd4MNx7b95VdT43CjOzxbDssnDBBSmot/TSsPPOKeH9wQdtP7dauFGYmXWCLbdMuYsjjkjn695oI3jyybyr6hxuFGZmnWSppeDcc+HPf4b581Pz+MlP4OOP865s8bhRmJl1su22g2eeSSOkTjsNNt88jZSqVm4UZmZlsPzycOWVcMst8MoraRjtuefCZ5/lXVn7uVGYmZXRXnulrYuddoKjjoIdd0yNo5q4UZiZldkqq8DkyekMelOmwNChaWujWmakdaMwM+sCEowdC08/DRtsAGPGwN57V8f5LtwozMy60Be+APffDxMmpFOwDhmStjYqmRuFmVkX694djjkGGhth1VVhjz3S1sa77+ZdWcvcKMzMcjJ0aArlHX88XHFF2iX10EN5V7UwNwozsxwtsQT8/OepQXTrBttuC+PHw3//m3dlTdwozMwqwFZbpQPd48bB2WfDppvC9Ol5V5W4UZiZVYjeveGii9JB7rfegmHD0tbGJ5/kW5cbhZlZhdltt3Tq1a99DU44AbbeGubMya8eNwozswq00kpw441w7bUwe3Y60H3RRfmE9NwozMwqlAT77ZemANlyS/jOd9LJkt54o2vrcKMwM6twAwbAPfekEyQ98EAK6U2a1HXv70ZhZlYFunVLZ86bNg3WWgv23Re+8Q14++0ueO/yv4WZmXWWddeFxx6Dk09OxzCGDi3/ebrdKMzMqkyPHvDTn8ITT6Rzdpf7PN1uFGZmVaqhoWvO0+1GYWZWxQrn6b7vvnSe7q22SlsbnXmebjcKM7MasP32MGNGOsB96qmde57usjYKScMlPSdpjqTjWnh8CUk3Zo8/KWnNctZjZlbL+vRJZ867+WZ4+eV0nu5f/nLxz9NdtkYhqTtwIbArMAgYLWlQs8XGAm9HxNrAucCZ5arHzKxe7L13mgJkp53gyCPTeboXRzm3KIYBcyLixYj4CLgB2KPZMnsAV2bXbwZ2kKQy1mRmVhean6d7cfTonJJa1B94tej2XGCzRS0TEZ9IegdYCXireCFJ44Bx2c0PJT1bloqrT1+aras65nXRxOuiiddFk3U7+sRyNoqWtgyaT2dVyjI610SiAAAFNklEQVRExERgIoCkxohoWPzyqp/XRROviyZeF028LppIauzoc8u562kusFrR7QHA64taRlIPYHngX2WsyczM2qmcjWIKMFDS5yX1AkYBk5stMxk4MLs+EvhzRB6T6JqZ2aKUbddTdszhMOAeoDtwWUTMlHQK0BgRk4HfAldLmkPakhhVwktPLFfNVcjroonXRROviyZeF006vC7kP+DNzKw1TmabmVmr3CjMzKxVFdsoPP1HkxLWxVGSZkmaIek+SWvkUWdXaGtdFC03UlJIqtmhkaWsC0n7ZL8bMyVd19U1dpUS/o+sLul+SdOy/ye75VFnuUm6TNKbi8qaKTk/W08zJG1c0gtHRMVdSAe/XwC+APQCngYGNVvmu8BF2fVRwI15153jutgOWDq7/p16XhfZcssCDwFPAA15153j78VAYBqwQnZ75bzrznFdTAS+k10fBLyUd91lWhdbAxsDzy7i8d2Au0kZts2BJ0t53UrdovD0H03aXBcRcX9EFE5Z8gQps1KLSvm9ADgVOAv4b1cW18VKWReHAhdGxNsAEfFmF9fYVUpZFwEsl11fnoUzXTUhIh6i9SzaHsBVkTwB9JG0aluvW6mNoqXpP/ovapmI+AQoTP9Ra0pZF8XGkv5iqEVtrgtJGwGrRcQdXVlYDkr5vVgHWEfSo5KekDS8y6rrWqWsi5OA/SXNBe4Cvt81pVWc9n6fAOWdwmNxdNr0HzWg5M8paX+gAdimrBXlp9V1IakbaRbiMV1VUI5K+b3oQdr9tC1pK/NhSUMi4t9lrq2rlbIuRgNXRMQ5krYg5beGRMRiTsBddTr0vVmpWxSe/qNJKesCSTsCJwAjIuLDLqqtq7W1LpYFhgAPSHqJtA92co0e0C71/8jvI+LjiPg78BypcdSaUtbFWGASQEQ8DixJmjCw3pT0fdJcpTYKT//RpM11ke1uuZjUJGp1PzS0sS4i4p2I6BsRa0bEmqTjNSMiosOToVWwUv6P3EYa6ICkvqRdUS92aZVdo5R18QqwA4Ck9UmNYl6XVlkZJgMHZKOfNgfeiYg32npSRe56ivJN/1F1SlwXE4DewE3Z8fxXImJEbkWXSYnroi6UuC7uAXaWNAv4FBgfEf/Mr+ryKHFdHA1cIulI0q6WMbX4h6Wk60m7Gvtmx2NOBHoCRMRFpOMzuwFzgA+Ag0p63RpcV2Zm1okqddeTmZlVCDcKMzNrlRuFmZm1yo3CzMxa5UZhZmatcqMwa0bSp5KmS3pW0u2S+nTy64+R9Kvs+kmSjunM1zfrbG4UZgubHxEbRsQQUkbne3kXZJYnNwqz1j1O0aRpksZLmpLN5X9y0f0HZPc9Lenq7L6vZudKmSbpT5L+J4f6zRZbRSazzSqBpO6kaR9+m93emTRX0jDS5GqTJW0N/JM0z9ZWEfGWpBWzl3gE2DwiQtIhwLGkhLBZVXGjMFvYUpKmA2sCU4F7s/t3zi7Tstu9SY1jA+DmiHgLICIKk1MOAG7M5vvvBfy9S6o362Te9WS2sPkRsSGwBukLvnCMQsDp2fGLDSNi7Yj4bXZ/S3PhXAD8KiKGAt8iTURnVnXcKMwWISLeAQ4HjpHUkzTp3MGSegNI6i9pZeA+YB9JK2X3F3Y9LQ+8ll0/ELMq5V1PZq2IiGmSngZGRcTV2RTVj2ez9L4P7J/NVPoz4EFJn5J2TY0hnVXtJkmvkaY8/3wen8FscXn2WDMza5V3PZmZWavcKMzMrFVuFGZm1io3CjMza5UbhZmZtcqNwszMWuVGYWZmrfo/9Jh0YhYTzU0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2666690650>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "precision, recall, thresholds = precision_recall_curve(Y, yhat)\n",
    "plt.clf()\n",
    "plt.title('Precision Recall Curve')\n",
    "plt.plot(recall, precision, 'b')\n",
    "plt.xlim([0.,1.])\n",
    "plt.ylim([0.,1.])\n",
    "plt.ylabel('Precision')\n",
    "plt.xlabel('Recall')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = np.empty([len(Y), kfold.n_splits])\n",
    "\n",
    "k = 0 \n",
    "for train, test in kfold.split(X, np.zeros(shape=(X.shape[0], 1))):\n",
    "    X_train, X_test = X[train], X[test]\n",
    "    y_train, y_test = dummy_y[train], dummy_y[test]\n",
    "    # Define model\n",
    "    model = generate_model()\n",
    "    # Fit the model\n",
    "    history = model.fit(X_train, y_train,\n",
    "                        batch_size=1200,\n",
    "                        epochs=100,\n",
    "                        verbose=0,\n",
    "                        shuffle=True,\n",
    "                        validation_data=(X_test, y_test),\n",
    "                        class_weight=class_weights)\n",
    "    # Store the predicted probabilities and iterate k\n",
    "    pred = model.predict_proba(X_test)[:,1]\n",
    "    predictions[test, k] = pred\n",
    "    k += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "       -5.0       0.00      0.00      0.00         0\n",
      "       -4.0       0.00      0.00      0.00         0\n",
      "       -3.0       0.00      0.00      0.00         0\n",
      "       -2.0       0.00      0.00      0.00         0\n",
      "       -1.0       0.00      0.00      0.00         0\n",
      "        0.0       1.00      0.98      0.99    284315\n",
      "        1.0       0.00      0.04      0.01       492\n",
      "        2.0       0.00      0.00      0.00         0\n",
      "        3.0       0.00      0.00      0.00         0\n",
      "        4.0       0.00      0.00      0.00         0\n",
      "\n",
      "avg / total       1.00      0.98      0.99    284807\n",
      "\n",
      "Predictions  -5  -4  -3  -2    -1       0     1    2   3   4\n",
      "Truth                                                       \n",
      "0.0           3   4  16  22  1243  277857  4914  241  12   3\n",
      "1.0           0   0   0   0     1     470    20    1   0   0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/anaconda2/lib/python2.7/site-packages/sklearn/metrics/classification.py:1137: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples.\n",
      "  'recall', 'true', average, warn_for)\n"
     ]
    },
    {
     "data": {
      "image/png": "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shUkU/P3338za9Yspk2bRsuWLcNKFHv27OGdd95h7dq1FAyuajnttNO46aabjivecePG0a5dOwoWLEiFChWoWLEic+fOpeE/PpBSduqpp3Lqqafy5ZdfHlcc6ZWju54SEqzsd5UqMH489OsHP/8ckiRU4YMPbM3SceOsiTF7ttdnci4HGTt2LM2bN6dy5cqcfPLJ/Pzzz2n+zqpVqyhXrhwnhNHl3KtXryNdRKE/zz///L+O3bhxI2eeeeaR+2XLlmXjxo3JPu5jjz1GjRo16NWrF/v3708zjkjKsV+Zly+HO++0yhpNmsDbb0PlykkOWr/e5kTExNjs6vPOi0aozuUKaX3zj5QRI0bQs2dPANq1a8eIESOoU6dOilcHpfeqoVdeeSXsY1U1rOd77rnnKF26NAcOHKBbt27079+fJ554Il1xZaQclygOHLAV5vr1g6JF7fO/S5eQKQ8JCTarukULK+I3axbUru31mZzLgbZt28a3337LkiVLEBEOHz6MiPDCCy9QsmRJtm/f/o/j//zzT0qVKkXFihVZv349u3btonjx4qk+R69evZg2bdq/trdr146HH374H9vKli3Lhg0bjtyPj4/njGQqO5x++ukAFCxYkC5dumTqwHVyclTXU+Jn/hNPwPXX27j0bbeFJIkVK6x5cdVVdjUTWGvCk4RzOdKoUaPo2LEj69at49dff2XDhg1UqFCB77//nkqVKrFp0yaWLVsGwLp161i4cCG1atWiSJEi3H777dx3330cCBYe27x5Mx9++OG/nuOVV15hwYIF//pJmiQAWrZsyciRI9m/fz9r165l5cqV1KtX71/Hbd68GbAWyNixY6n+j/UMokBVs9VP3bp1NamdO1XvuksVVMuVU50wIckBBw+qPv+8asGCqiVKqP7vf6oJCf96HOdcxoqLi4vq8zdu3FgnTZr0j22vvfaadu/eXVVVv//+e61fv77WrFlTY2Ji9Kuvvjpy3P79+/XBBx/Uc845R6tVq6b16tXTyZMnH3dM/fr107PPPlsrV66sEydOPLK9RYsWunHjRlVVbdq0qVavXl2rVaumt9xyi+7atUtVVTdv3qxlypTR4sWL64knnqhlypTRnTt3/us5kjvvQKwe4+euaDJ9ZllZTEyMxsbGHrmvar1IU6fa/IhnnoFixZL8UrNm8NVXVv510CAoXTpzg3Yu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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f264c1a6390>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "yhat = np.nanmean(predictions, axis=1).round().astype(int)\n",
    "# yhat = stats.mode(predictions.T).mode.T[:,0]\n",
    "# yhat = np.max(predictions, axis=1).round().astype(int)\n",
    "\n",
    "# Performance\n",
    "print(classification_report(Y, yhat))\n",
    "print(pd.crosstab(Y, yhat.flatten(), rownames=['Truth'], colnames=['Predictions']))\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(Y, yhat)\n",
    "roc_auc = auc(fpr, tpr)\n",
    "\n",
    "plt.title('Receiver Operating Characteristic')\n",
    "plt.plot(fpr, tpr, 'b', label='AUC = %0.2f'% roc_auc)\n",
    "plt.legend(loc='lower right')\n",
    "plt.plot([0,1],[0,1],'r--')\n",
    "plt.xlim([0.,1.])\n",
    "plt.ylim([0.,1.])\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train: [1 3 4 5 6 7] | test: [0 2]\n",
      " \n",
      "Train: [0 2 4 5 6 7] | test: [1 3]\n",
      " \n",
      "Train: [0 1 2 3 5 7] | test: [4 6]\n",
      " \n",
      "Train: [0 1 2 3 4 6] | test: [5 7]\n",
      " \n",
      "-----\n",
      "Train: [3 4 5 6 7] | test: [0 1 2]\n",
      " \n",
      "Train: [0 1 2 6 7] | test: [3 4 5]\n",
      " \n",
      "Train: [0 1 2 3 4 5] | test: [6 7]\n",
      " \n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "from sklearn.model_selection import KFold,StratifiedKFold\n",
    "\n",
    "X=np.array([\n",
    "    [1,2,3,4],\n",
    "    [11,12,13,14],\n",
    "    [21,22,23,24],\n",
    "    [31,32,33,34],\n",
    "    [41,42,43,44],\n",
    "    [51,52,53,54],\n",
    "    [61,62,63,64],\n",
    "    [71,72,73,74]\n",
    "])\n",
    "\n",
    "y=np.array([1,1,0,0,1,1,0,0])\n",
    "#n_folds这个参数没有，引入的包不同，\n",
    "floder = KFold(n_splits=3,random_state=0,shuffle=False)\n",
    "sfolder = StratifiedKFold(n_splits=4,random_state=0,shuffle=False)\n",
    "\n",
    "for train, test in sfolder.split(X,y):\n",
    "    print('Train: %s | test: %s' % (train, test))\n",
    "    print(\" \")\n",
    "\n",
    "print(\"-----\")\n",
    "for train, test in floder.split(X,y):\n",
    "    print('Train: %s | test: %s' % (train, test))\n",
    "    print(\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TRAIN: [1 3 4 5] TEST: [0 2]\n",
      "TRAIN: [0 1 2 3] TEST: [4 5]\n",
      "TRAIN: [0 2 4 5] TEST: [1 3]\n",
      "TRAIN: [1 3 4 5] TEST: [0 2]\n",
      "TRAIN: [0 2 3 4] TEST: [1 5]\n",
      "TRAIN: [0 1 2 5] TEST: [3 4]\n",
      "TRAIN: [0 1 3 4] TEST: [2 5]\n",
      "TRAIN: [0 1 2 5] TEST: [3 4]\n",
      "TRAIN: [2 3 4 5] TEST: [0 1]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import RepeatedStratifiedKFold\n",
    "X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [3, 7], [9, 4]])\n",
    "# y = np.array([0, 0, 1, 1, 0, 1]) # <<< works\n",
    "y = X # does not work if passed into `.split`\n",
    "rskf = RepeatedStratifiedKFold(n_splits=3, n_repeats=3, random_state=36851234)\n",
    "for train_index, test_index in rskf.split(X, np.zeros(shape=(X.shape[0], 1))):\n",
    "    print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
    "    X_train, X_test = X[train_index], X[test_index]\n",
    "    y_train, y_test = y[train_index], y[test_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 3 2 2 1 1]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from scipy import stats\n",
    "\n",
    "a = np.array([[1, 3, 4, 2, 2, 7],\n",
    "              [5, 2, 2, 1, 4, 1],\n",
    "              [3, 3, 2, 2, 1, 1]])\n",
    "\n",
    "m = stats.mode(a)\n",
    "print(m.mode)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2.7",
   "language": "python",
   "name": "python27"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
